package br.com.usjt.sge.reserva;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.Query;
import org.hibernate.Session;

import br.com.usjt.sge.estacionamento.Estacionamento;

public class ReservaDAOHibernate implements ReservaDAO {

	private static final Logger logger = Logger
			.getLogger(ReservaDAOHibernate.class.getName());
	private Session session;

	public void setSession(Session session) {
		this.session = session;
	}

	public void salvar(Reserva reserva) {

		try {

			this.session.save(reserva);
			logger.info("Reserva salva na base de dados.");

		} catch (Exception e) {

			logger.error("Erro ao salvar a reserva - " + e.getMessage());
			throw new ExceptionInInitializerError();

		}

	}

	public void excluir(Reserva reserva) {

		try {
			this.session.delete(reserva);
			logger.info("Reserva excluida da base de dados.");

		} catch (Exception e) {

			logger.error("Erro ao excluir a reserva - " + e.getMessage());
			throw new ExceptionInInitializerError();

		}

	}

	public void alterar(Reserva reserva) {

		try {

			this.session.update(reserva);
			logger.info("Reserva alterada com sucesso.");

		} catch (Exception e) {
			logger.error("Erro ao alterar o estado atual da reserva - "
					+ e.getMessage());
			throw new ExceptionInInitializerError();
		}

	}

	public Reserva buscar(Integer cod_reserva) {

		return null;
	}

	public List<Reserva> buscarPorUsuario(Integer cod_usuario) {

		String hql = "select r from reserva r where r.cod_usuario = :cod_usuario";
		Query consulta = this.session.createQuery(hql);
		consulta.setInteger("cod_usuario", cod_usuario);
		return this.session.createCriteria(Reserva.class).list();
	}

	public List<Reserva> listar(Reserva reserva) {

		return this.session.createCriteria(Reserva.class).list();
	}

	@Override
	public List<Reserva> lista(Integer cod_estacionamento) {
		String hql = "select r from reserva r where r.cod_estacionamento = :cod_estacionamento";
		Query consulta = this.session.createQuery(hql);
		consulta.setInteger("cod_estacionamento", cod_estacionamento);
		return this.session.createCriteria(Reserva.class).list();
	}

	@Override
	public Reserva buscarReservaPorNum(String num_reserva) {
		try {

			String hql = "select r from Reserva r where r.num_reserva = :num_reserva";
			Query consulta = this.session.createQuery(hql);
			consulta.setString("num_reserva", num_reserva);

			logger.info("Consultando reserva por número.");
			return (Reserva) consulta.uniqueResult();

		} catch (Exception e) {

			logger.error("Erro na buscar reserva por número: " + e.getMessage());
			throw new ExceptionInInitializerError();

		}
	}

	@Override
	public List<Reserva> reservasPorUsuario(Integer codUsuario) {
		
		List<Reserva> reservas = new ArrayList<Reserva>();
		
		try {

			String hql = "select r from Reserva r where r.usuario = :codigoUsuario";
			Query consulta = this.session.createQuery(hql);
			consulta.setInteger("codigoUsuario", codUsuario);

			logger.info("Consultando reserva por usuario.");
			return consulta.list();

		} catch (Exception e) {

			logger.error("Erro na buscar reserva por usuario: " + e.getMessage());
			throw new ExceptionInInitializerError();

		}
	}
}
